package cn.yza.基础.迭代器;

import java.util.*;

/** 快速失败机制产生的条件:当多个线程对Collection进行操作时，若其中某一个线程通过Iterator遍历集合时，该集合的内容被其他线程所改变，
 * 则会抛出ConcurrentModificationException异常。
 　　所以要保证在使用Iterator遍历集合的时候不出错误，就应该保证在遍历集合的过程中不会对集合产生结构上的修改。
 使用Foreach时对集合的结构进行修改会出现异常:
 　　上面我们说了实现了Iterable接口的类就可以通过Foreach遍历，那是因为foreach要依赖于Iterable接口返回的Iterator对象，
 所以从本质上来讲，Foreach其实就是在使用迭代器，在使用foreach遍历时对集合的结构进行修改，
 和在使用Iterator遍历时对集合结构进行修改本质上是一样的。所以同样的也会抛出异常，执行快速失败机制。
 　　foreach是JDK1.5新增加的一个循环结构，foreach的出现是为了简化我们遍历集合的行为。
 for循环与迭代器的对比:
 　　* 效率上各有各的优势:
 　　　　> ArrayList对随机访问比较快，而for循环中使用的get()方法，采用的即是随机访问的方法，因此在ArrayList里for循环快。
 　　　　> LinkedList则是顺序访问比较快，Iterator中的next()方法采用的是顺序访问方法，因此在LinkedList里使用Iterator较快。
 　　　　> 主要还是要依据集合的数据结构不同的判断。
 * @author Honglixi
 * @create 2021-10-23 21:22
 */
public class IteratorTest {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("张三1");
        list.add("张三2");
        list.add("张三3");
        list.add("张三4");

        List<String> linkList = new LinkedList<String>();
        linkList.add("link1");
        linkList.add("link2");
        linkList.add("link3");
        linkList.add("link4");

        Set<String> set = new HashSet<String>();
        set.add("set1");
        set.add("set2");
        set.add("set3");
        set.add("set4");
        //使用迭代器遍历ArrayList集合
        Iterator<String> listIt = list.iterator();
        while (listIt.hasNext()) {
            System.out.println(listIt.next());
        }
//        //使用迭代器遍历Set集合
//        Iterator<String> setIt = set.iterator();
//        while (setIt.hasNext()) {
//            System.out.println(listIt.next());
//        }
//        //使用迭代器遍历LinkedList集合
//        Iterator<String> linkIt = linkList.iterator();
//        while (linkIt.hasNext()) {
//            System.out.println(listIt.next());
//        }

        List<String> list2 = new ArrayList<String>();
        list2.add("张三1");
        list2.add("张三2");
        list2.add("张三3");
        list2.add("张三4");
        for (String string : list2) {
            System.out.println(string);
        }
    }
}
